1. 비디오 재생

  • 최근 고성능 스마트폰이 제공하는 멀티미디어 기능은 거의 PC 수준에 육박하여 폰으로도 웬만한 동영상은 충분히 감상가능하다.

1.1 재생 가능한 미디어 소스

  • 실행 파일에 내장된 리소스
  • SD카드에 파일 형태로 저장된 미디어
  • 네트워크로 전송되는 스트림(Streaming)

1.2 공식적으로 재생가능한 포맷

Format / CodecSupported File Type(s) / Container Formats
H.2633GPP (.3gp)

MPEG-4 (.mp4)
H.264 AVC3GPP (.3gp)

MPEG-4 (.mp4)

MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)
MPEG-4 SP(Simple Profile)3GPP (.3gp)
VP8WebM (.webm)

[Matroska
http://ko.wikipedia.org/wiki/Matroska] (.mkv, Android 4.0+)

1.3 비디오재생을 위한 핵심 클래스.

  • 미디어 재생을 위한 핵심 클래스는 MediaPlayer클래스.
  • 상태에 맞추어 허용된 메서드만 호출.
  • 예외처리 필요.
  • 재생 위치도 타이머 돌려가며 조사.
  • 시크바의 터치를 입력받아 위치도 직접 옮겨야 함.
  • 기능이 너무 많다 보니 섬세한 통제를 할수는 있지만 단순 재생일 경우엔 번거롭다.
1.4 고수준의 편리한 재생을 위한 클래스.
  • 단순 재생이라면 VideoView클래스를 사용.
  • 동영상 재생만을 담당하는 위젯.
  • 미디어의 크기에 따라 자신의 크기를 자동으로 조절.
  • 컨트롤러를 지정하면 재생 위치표시와 재생/중지 동작을 위한 UI까지 제공됨.

1.5 간단한 비디오 재생 샘플.

  • 폴더구조
  • 기존에 레이아웃 폴더와는 다른 res\layout-land\main.xml 처럼 따로 layout-land폴더를 생성해서 만들면 기기를 가로로 했을때 나타나는 레이아웃을 지정할수있다.
  • 영상파일abc.avi는 \res\raw(컴파일이 필요없는 리소스) 폴더에 넣어두었다.

res/layout/main.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    tools:context=".SimpleVideoActivity" >

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

</LinearLayout>

src/com/example/simplevideo/SimpleVideoActivity.java


package com.example.simplevideo;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.widget.MediaController;
import android.widget.VideoView;

public class SimpleVideoActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		// 생성한 비디오뷰를 선언
		VideoView videoView = (VideoView) findViewById(R.id.videoView1);
		
		// 비디오뷰를 커스텀하기 위해서 미디어컨트롤러 객체 생성
		MediaController mediaController = new MediaController(this);
		
		// 비디오뷰에 연결
		mediaController.setAnchorView(videoView);
		
		// 안드로이드 res폴더에 raw폴더를 생성 후 재생할 동영상파일을 넣습니다. 확장자는 빼고
		//Uri video = Uri.parse("android.resource://" + getPackageName()+ "/raw/abc");
                // R객체를 이용해 접근도 가능
		Uri video = Uri.parse("android.resource://" + getPackageName()+ "/" + R.raw.abc);

                //비디오뷰의 컨트롤러를 미디어컨트롤로러 사용
		videoView.setMediaController(mediaController);
		
		//비디오뷰에 재생할 동영상주소를 연결
		videoView.setVideoURI(video);

		//비디오뷰를 포커스하도록 지정
		videoView.requestFocus();
		
		//동영상 재생(바로재생하지않도록 주석처리)
 		//videoView.start();
	}	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.simple_video, menu);
		return true;
	}

}